package Ep07_BackTrack.Back5_0017;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Jimmy Zhan WORKSTATION
 * @date 2023/7/10 14:41
 * 说明：
 */

public class Mine {
    List<String> list = new ArrayList<>();
    String[] letterMap = {
        "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"
    };
    public List<String> letterCombinations(String digits) {
        if (digits == null || digits.length() == 0) {
            return list;
        }
        backtrack(digits, letterMap, 0);
        return list;
    }

    // 每次迭代获取一个字符串，所以会设计大量的字符串拼接，所以这里选择更高效的StringBuilder
    StringBuilder temp = new StringBuilder();

    // digits 为 2,3，num为0，则str表示2对应的abc
    public void backtrack(String digits, String[] numString, int num) {
        // 终止条件
        if (num == digits.length()) {   // 每个组合中一个按钮对应一个字母，因此每个组合的长度就是digits的长度
            list.add(temp.toString());
            return;
        }
        // 递归逻辑
        // str表示当前num对应的字符串
        String str = numString[digits.charAt(num) - '0'];
        for (int i = 0; i < str.length(); ++i) {
            temp.append(str.charAt(i));
            backtrack(digits, numString, num + 1);
            temp.deleteCharAt(temp.length() - 1);
        }
    }
}
